# ifndef __PUNTODIBUJO__H_

# define __PUNTODIBUJO__H_

# include "figura.h"

# include "punto.h"

class PuntoDibujo: public Figura
{
	public:
	
		PuntoDibujo():x(0), y(0), r(1)
		{
		};
		
		PuntoDibujo(Punto a):x(a.getX()), y(a.getY()), r(1) 
		{
		};
		
		PuntoDibujo(const PuntoDibujo &pd):Figura(pd), x(pd.x), y(pd.y), r(pd.r)
		{
		};
		
		~PuntoDibujo()
		{
			this->x = 0;
			
			this->y = 0;
			
			this->r = 0;
		};
		
		void trasladar(float, float);
		
		void redimensionar(float, float);
		
		float getX()
		{
			return (x);
		};
		
		float getY()
		{
			return (y);
		};

		virtual Punto supIzq()
		{
			Punto p((this->x - r), (this->y + r)); 
			
			return (p);
		};
		
		virtual Punto infDer()
		{
			Punto p((this->x + r), (this->y - r)); 
			
			return (p);
		};
		
		virtual string Texto(int tab = 0)
		{			
			stringstream ret;
			
			for (int i = 0; i < tab; i++) ret << '\t';
			
			ret << "Punto:\n\t" << "X: " << x <<" Y: " << y  << endl;
			
			return (ret.str());
		};
		
		virtual bool seleccionar(float x, float y)
		{
			bool ret = false;
	 
			if ((x > (this->x - r)) && (x < (this->x + r)) && (y > (this->y - r)) && (y < (this->y + r)))
			{
				ret = true;
			}	
	
			return (ret);
		};
		
		virtual bool contenida (Punto a, Punto b)
		{
			bool ret = false;
	 
			if ((a.getX() <= (this->x - r)) && (b.getX() >= (this->x + r)) && (b.getY() <= (this->y - r)) && (a.getY() >= (this->y + r)))
			{
				ret = true;
			}
			
			return (ret);
		};
		
		virtual PuntoDibujo* clonar ()
		{
			return (new PuntoDibujo (*this));
		};
		
		virtual list<Figura*> pintar()
		{
			list<Figura*> ret;
			
			ret.push_back((Figura*)this->clonar());
			
			return ret;
		}
		
	private:
		
		float x;
		
		float y;
		
		float r;
};

# endif
